# @符号
# @作为修饰符
有如下代码
def funB(funA):
print("in funB")
return "return from FunB()"
@funB
def funA():
print("in FunA")
return "return from FunA()"
# @funB等价于funB(funA)
@funB这里的funB就是修饰函数,用来修饰输入进来的函数,所以funB的参数是一个函数,也就是这里的funA。直接运行以上代码,得到的输出如下:
in funB
也就是说,程序进入了funB函数。
# 修饰函数返回的是修饰完的函数
重点啊!这是理解修饰符含义的核心!修饰函数返回的是修饰完的函数!!!
运行下面代码:
def funB(funA):
print("in funB")
return "return from FunB()"
# @funB
def funA():
print("in FunA")
return "return from FunA()"
print(funA)
没有修饰的情况下,funA理论上输出的是一个function对象。输出:
<function funA at 0x0000016CB7AD0CA0>
加上修饰后的结果:
in funB
return from FunB()
输出的第一行in funB是之前所说进入funB函数内print的内容;第二行就是print(funA)的输出结果,可见funA = "return from FunA()",是一个字符串,而不是函数对象。
# @作为运算符
用于向量、矩阵乘法,等价于np.dot:
import numpy as np
num1 = np.array([1,2,3])
num2 = np.array([[1,2,3]])
print(num1.shape)
print(num2.shape)
print('==============')
print(num1 @ num1)
print(num2 @ num2.T)
print(num2.T @ num2)
print('==============')
print(np.dot(num1, num1))
print(np.dot(num2, num2.T))
print(np.dot(num2.T, num2))
输出结果:
(3,)
(1, 3)
==============
14
[[14]]
[[1 2 3]
[2 4 6]
[3 6 9]]
==============
14
[[14]]
[[1 2 3]
[2 4 6]
[3 6 9]]